<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Document</title>
	</head>
	<body>
		
	</body>
</html>
<script>
	//通过自面量的方式直接创建对象
	//对象是由key-value组成的无序集合
	var person = {
		//key可以是字符串也可以是变量
		name:"xiaoli",
		age:22,
		hit:function(){
			//this在哪个作用域，就代表该作用域上下文对象
			console.log(this.name + "age" + this.age + "xihuandaren");
		}
	};
	console.log(person.name,person.age);
	console.log(person["name"],person["name"]);
	//调用对象的方法
	person.hit();

	//修改属性的值
	person.name = "huhu";
	person["age"] =20;
    
    //以目录的形式打印对象
    console.dir(person);

    //遍历对象
    for (var key in person){
    	console.log(key);
    	console.log(person[key]);

    }

    //对象的属性
    //自有属性：创建对象时给对象添加的属性
     console.log(person.hasOwnProperty("name"));
     console.log(person.hasOwnProperty("hit"));
    
    //继承属性：从父辈继承过来的属性
     console.log(person.hasOwnProperty("hasOwnProperty"));//不是自由属性，因为是他"爹"的
     console.log(person.toString());
     

     //给对象添加属性
     person.a = 5;
     console.log(person.hasOwnProperty("a"));

     //非严格模式下，可以通过该方法删除对象的属性
     delete person.a;
     console.log(person.a);

     //创建一个对象继承与person
    var o = Object.create(person);
     console.log(o);

     //创建一个对象继承与person
     var o2 = Object.create(null);
     console.log(o2);

     var cat = {
     	type:"波斯猫",
     	voice:"喵喵叫",
     	age:1
     };

     //获取自有属性的描述信息
     //value:属性对应的值
     //writable：可写性
     //enumerable:可枚举性
     //configurable:可配置
      console.log(Object.getOwnPropertyDescriptor(cat,"type"));

      //配置属性
      Object.defineProperty(cat, "type",{
      	//可写性为false的话，该属性的值不能被修改
      	writable:false,
        
        //该属性是否可被枚举（通过for。。。in遍历出来）
      	enumerable:false,
      	//只要该属性定义为false，以后该属性就不能再进行配置
      	//configurable:false
      });

      cat.type = "布偶猫";
      console.log(cat.type);

      //判断属性是否被枚举
      console.log(cat.propertyIsEnumerable("type"));

      for(var key in cat){
      	console.log(key);
      }

      Object.defineProperty(cat,"type",{
      	value:"叮当猫",
      	writable:true
      });
      console.log(cat.type);

      //同时配置多个属性
      Object.defineProperties(cat, {
      	age: {value:29, writable:false},
      	voice:{value:"旺旺"}
      });

      //存储器属性
       var dog = {
          w:50,
          h:80,
          //getter 方法 读取器
          get square(){
          	   //get要有返回值
               return this.w * this.h;
          },
          //setter 方法 设置器
          set square(obj){
               this.w = obj.w;
               this.h = obj.h;
               //set方法中不能对该属性赋值
               //this.square = obj;
          }
       };
        //会自动调用get方法
       console.log(dog.square);
       //会自动调用set方法
       dog.square = {w:3, h: 297};
       console.log(dog.square);
       
       //修改存储属性的值
       Object.defineProperty(dog,"square",{
       	get:function(){
       		return this.w * this.h + 50;
       	}
       });


</script>